/******************************************************************************
 *
 * @file       httpmgr.h
 * @brief      单例模式实现http请求发送和接收的管理
 *
 * @author     ario
 * @date       2024/05/14
 * @history
 *****************************************************************************/

#ifndef HTTPMGR_H
#define HTTPMGR_H


#include "singleton.h"
#include "global.h"

#include <QObject>

#include <QUrl>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QJsonObject>
#include <QJsonDocument>


/*
 *  CRTP C++：Curiously Recurring Template Pattern，即奇异递归模板模式
 *      1. 基类是一个模板类
 *      2. 派生类继承该基类时，将派生类自身作为模板参数传递给基类
 *  CRTP的特点：
 *      优点：省去动态绑定、查询虚函数表带来的开销。通过CRTP，基类可以获得到派生类的类型，提供各种操作，比普通的继承更加灵活。但CRTP基类并不会单独使用，只是作为一个模板的功能。
 *      缺点：模板的通病，即影响代码的可读性。
*/

class HttpMgr : public QObject, public Singleton<HttpMgr>,
        public std::enable_shared_from_this<HttpMgr>
{
    Q_OBJECT
    friend class Singleton<HttpMgr>;
public:
    ~HttpMgr();

    // 发送http的post请求
    void PostHttpReq(QUrl url, QJsonObject json, ReqId req_id, Modules mod);

signals:
    // 信号：接收到http回复时发送的信号
    void sig_http_finish(ReqId req_id, QString res, ErrorCodes err, Modules mod);

    // 信号：http请求是注册请求时发送的信号
    void sig_reg_mod_finish(ReqId req_id, QString res, ErrorCodes err);
    // 信号：http请求是重置密码请求时发送的信号
    void sig_reset_mod_finish(ReqId req_id, QString res, ErrorCodes err);
    // 信号：http请求是重置密码请求时发送的信号
    void sig_login_mod_finish(ReqId req_id, QString res, ErrorCodes err);


private slots:
    // 槽函数：接收到http回复时的信号后执行的槽函数
    void slot_http_finish(ReqId req_id, QString res, ErrorCodes err, Modules mod);

private:
    HttpMgr();

private:
    QNetworkAccessManager _manager;
};

#endif // HTTPMGR_H
